package com.hauwei.huaweishop.controller;

import com.hauwei.huaweishop.entity.Goodinfos;
import com.hauwei.huaweishop.service.GoodinfosService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 商品信息controller层
 */
@RestController
@CrossOrigin
@Slf4j
@RequestMapping("/goodinfos")
public class GoodinfosController {
    @Autowired
    private GoodinfosService goodinfosService;
    //图片存放磁盘地址
    @Value("${img.dir}")
    private String realPath;

    /**
     * 查找所有信息
     * @return
     */
    @GetMapping("/findAllGoodinfos")
    public Map<String, Object> findAllGoodinfos(){
        Map<String, Object> resultMap = new HashMap<>();
        try {
            // 查询员工的信息
            List<Goodinfos> goodinfosList = goodinfosService.queryGoodinfosList();
            resultMap.put("records", goodinfosList);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息查询成功");
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息查询失败");
        }
        return resultMap;
    }

    /**
     * 根据类型查找所有信息
     * @return
     */
    @GetMapping("/findAllGoodinfosByShoptyes")
    public Map<String, Object> findAllGoodinfosByShoptyes(String shoptype){
        Map<String, Object> resultMap = new HashMap<>();
        try {
            // 查询信息的信息
            List<Goodinfos> goodinfosList = goodinfosService.queryGoodinfosListByShoptypes(shoptype);
            resultMap.put("records", goodinfosList);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息查询成功");
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息查询失败");
        }
        return resultMap;
    }

    /**
     * 通过id查询信息
     * @param id
     * @return
     */
    @GetMapping("/findOneGoodinfosById")
    public Map<String, Object> findOneGoodinfosById(Integer id){
        Map<String, Object> resultMap = new HashMap<>();
        try {
            Goodinfos goodinfosById = goodinfosService.queryByGid(id);
            resultMap.put("records", goodinfosById);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息查询成功");
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息查询失败");
        }
        return resultMap;
    }

    /**
     * 通过名称查询信息
     * @param name
     * @return
     */
    @GetMapping("/findOneByGoodinfosName")
    public Map<String, Object> findOneByName(String name){
        Map<String, Object> resultMap = new HashMap<>();
        try {
            Goodinfos queryByGname = goodinfosService.queryByGname(name);
            resultMap.put("records", queryByGname);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息查询成功");
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息查询失败");
        }
        return resultMap;
    }

    /**
     * 添加方法
     * @param goodinfos
     * @return
     */
    @PostMapping("/addGoodinfos")
    public Map<String, Object> addGoodinfos(Goodinfos goodinfos, MultipartFile file) throws IOException {
        log.info("商品信息信息：[{}]", goodinfos);
        log.info("商品信息图片地址：[{}]", file.getOriginalFilename());
        Map<String, Object> resultMap = new HashMap<>();
        try {
            // 获取原始图片的扩展名
            String originalFilename = file.getOriginalFilename();
            //生成新的文件名字  UUID可以避免名字重复
            String newFileName = UUID.randomUUID().toString()+'.'+ FilenameUtils.getExtension(originalFilename);
            // 封装上传文件位置的全路径
            File targetFile = new File(realPath, newFileName);
            // 把本地文件上传到封装上传文件位置的全路径
            file.transferTo(targetFile);
            // 设置图片地址
            goodinfos.setGphoto(newFileName);
            // 新增信息
            goodinfosService.addGoodinfos(goodinfos);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息增加成功");
        }catch (Exception e){
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息增加失败");
        }
        return resultMap;
    }

    /**
     * 根据id删除信息
     * @param id
     * @return
     */
    @GetMapping("/deletGoodinfosById")
    public Map<String, Object> deletGoodinfosById(Integer id){
        Map<String, Object> resultMap = new HashMap<>();
        log.info("删除信息id：[{}]", id);
        try {
            // 删除磁盘图片
            Goodinfos goodinfos = goodinfosService.queryByGid(id);
            // 获取图片信息地址
            File file = new File(realPath, goodinfos.getGphoto());
            // 如果图片地址存在，删除图片
            if (file.exists()) file.delete();
            // 删除信息
            goodinfosService.deleteGoodinfosByGid(id);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息删除成功");
        }catch (Exception e){
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息删除失败");
        }
        return resultMap;
    }

    /**
     * 根据name删除信息
     * @param name
     * @return
     */
    @GetMapping("/deletGoodinfosByName")
    public Map<String, Object> deletGoodinfosByName(String name){
        Map<String, Object> resultMap = new HashMap<>();
        log.info("删除信息name：[{}]", name);
        try {
            // 删除信息
            goodinfosService.deleteGoodinfosByGname(name);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息删除成功");
        }catch (Exception e){
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息删除失败");
        }
        return resultMap;
    }

    /**
     * 修改信息
     * @param goodinfos
     * @return
     */
    @RequestMapping("/updateGoodinfos")
    public Map<String, Object> updateGoodinfos(Goodinfos goodinfos, MultipartFile file){
        Map<String, Object> resultMap = new HashMap<>();
        log.info("修改信息：[{}]", goodinfos);
        log.info("图片信息：[{}]", file.getOriginalFilename());
        try {
            if (file!=null){
                // 取得图片的名称
                String originalFilename = file.getOriginalFilename();
                // 重新给文件取名
                String newFileName = UUID.randomUUID().toString() + '.' + FilenameUtils.getExtension(originalFilename);
                File targetFile = new File(realPath, newFileName);
                // 放到磁盘中
                file.transferTo(targetFile);
                // 设置存放到数据库的地址
                goodinfos.setGphoto(newFileName);
            }
            // 修改信息
            goodinfosService.updateGoodinfos(goodinfos);
            resultMap.put("status", true);
            resultMap.put("code", 200);
            resultMap.put("msg", "商品信息修改成功");
        }catch (Exception e){
            resultMap.put("status", false);
            resultMap.put("code", 500);
            resultMap.put("msg", "商品信息修改失败");
        }
        return resultMap;
    }
}
